//package cn.good.yan.config.demo2;
//
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.security.config.Customizer;
//import org.springframework.security.config.annotation.web.builders.HttpSecurity;
//import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
//import org.springframework.security.web.SecurityFilterChain;
//
///**
// * 二
// * 1. Spring Security - 自定义配置
// * 【用户认证 - 前后端分离】  前后端分离，前端调用接口，返回json信息
// * 演示：
// * 1. 进行登录：http://localhost:8080/login （默认的登录接口）
// * 2。用户密码，正确的进行 MyAuthenticationSuccessHandler 过滤器，否则进入 MyAuthenticationFailureHandler 过滤器
// * 3. 用户注销，进入 MyLogoutSuccessHandler 过滤器
// * 4. 请求未认证的接口。进入 MyAuthenticationEntryPoint 过滤器
// *
// * @author shengren.yan
// * @create 2024-07-16
// */
//@Configuration
//@EnableWebSecurity
//public class WebSecurityConfig {
//
//    // 演示：自定义登录页
//    @Bean
//    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
//        http
//                .authorizeRequests(authorize -> {
//                    authorize
//                            .anyRequest()      // 对所有请求开启授权保护
//                            .authenticated();  // 已认证的请求会自动授权
//                })
//                .formLogin(form -> {
//                    form
//                            .loginPage("/login").permitAll()   // 登录页面无需授权即可访问
//                            .usernameParameter("username")     // 自定义表单用户名参数，默认是username
//                            .passwordParameter("password")     // 自定义表单密码参数，默认是password
//                            .failureUrl("/login?error")       //登录失败的返回地址
//                            .successHandler(new MyAuthenticationSuccessHandler()) //认证成功时的处理
//                            .failureHandler(new MyAuthenticationFailureHandler()) //认证失败时的处理
//                    ;
//                });
//
//
//        http.logout(logout -> {
//            logout.logoutSuccessHandler(new MyLogoutSuccessHandler()); // 注销成功时的处理
//        });
//
//        http.exceptionHandling(exception -> {
//            exception.authenticationEntryPoint(new MyAuthenticationEntryPoint()); // 请求未认证的接口
//        });
//
//        // 会话管理 - 处理
//        http.sessionManagement(session -> {
//            session
//                    .maximumSessions(1)  // 代表当前登录同一个用户，数量超过1，触发该逻辑
//                    .expiredSessionStrategy(new MySessionInformationExpiredStrategy());
//        });
//
//        // 跨域处理
//        http.cors(Customizer.withDefaults());
//
//        // 暂时关闭csrf攻击
//        http.csrf(csrf -> csrf.disable());
//        return http.build();
//    }
//
//}
